package lzupdater.log;

import java.util.ArrayList;

import lzupdater.utils.Pair;

//LZRosterUpdater, a java client to update LZRoster
//Copyright (C) 2008 Fraskor from Krasus (e-mail: fraskor@gmail.com)
//
//This file is part of LZRosterUpdater.
//
//LZRosterUpdater is free software: you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program.  If not, see <http://www.gnu.org/licenses/>.

/**
 * 
 * @author Fraskor
 */
public class DefaultLogger implements Logger {

	private ArrayList<Pair<LoggerListener, Boolean>> loggerListeners = new ArrayList<Pair<LoggerListener, Boolean>>();

	private LoggerLevel verboseLevel = LoggerLevel.DEBUG;

	public void clear() {
		for (Pair<LoggerListener, Boolean> pair : loggerListeners) {
			pair.getValue1().clear();
		}
	}
	
	public void addLoggerListener(LoggerListener loggerListener,
			boolean withoutLevelHeader) {
		loggerListeners.add(Pair.make(loggerListener, withoutLevelHeader));
	}

	public void setVerboseLevel(LoggerLevel level) {
		verboseLevel = level;
	}

	public LoggerLevel getVerboseLevel() {
		return verboseLevel;
	}

	public void info(Object msg) {
		write(msg, LoggerLevel.INFO);
	}

	public void warning(Object msg) {
		write(msg, LoggerLevel.WARNING);
	}

	public void error(Object msg) {
		write(msg, LoggerLevel.ERROR);
	}

	public void debug(Object msg) {
		write(msg, LoggerLevel.DEBUG);
	}

	public void write(Object msg, LoggerLevel level) {
		String message = String.format("%s %s", level.getHeader(), msg);
		for (Pair<LoggerListener, Boolean> pair : loggerListeners) {
			LoggerListener l = pair.getValue1();
			if (level.isGreaterOrEqualTo(l.getLoggerLevel())) {
				if (pair.getValue2()) {
					l.displayMsg(msg.toString(), level);
				} else {
					l.displayMsg(message, level);
				}
			}
		}
	}

	public void format(LoggerLevel level, String format, Object... args) {
		write(String.format(format, args), level);
	}

}
